/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package reportcenter.report.support.exporter;

import java.io.IOException;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TimerTask;
import javax.swing.JOptionPane;
import org.openide.util.Exceptions;
import org.springframework.richclient.util.EventListenerListHelper;
import reportcenter.report.dominio.param.ReportParam;
import reportcenter.report.dominio.report.Report;
import reportcenter.report.support.ReportManager;
import reportcenter.support.features.BrazilianToAmericanLocale;
import reportcenter.support.features.IsDB2Driver;
import reportcenter.support.IsNumber;
import reportcenter.support.features.AnswerTransform;
import reportcenter.support.features.DeparaFilialQQToTB;
import reportcenter.support.features.Feature;
import reportcenter.support.features.SpecialFeature;
import reportcenter.support.sorting.CollectionSorting;
import reportcenter.support.threading.JobListener;
import reportcenter.support.threading.WorkerJob;

/**
 *
 * @author renan
 */
public class XlsExporterExecutor extends TimerTask implements WorkerJob {

    private Report report;

    public XlsExporterExecutor(Report report) {
        this.report = report;
    }
    private EventListenerListHelper listeners = new EventListenerListHelper(JobListener.class);

    public void addJobListener(JobListener l) {
        listeners.add(l);
    }

    public void removeJobListener(JobListener l) {
        listeners.remove(l);
    }

    public void run() {
        listeners.fire("start");
        executor();
        listeners.fire("end");
        listeners.fire("status", "Geração de relatório finalizada!");
    }

    public boolean executor() {

        boolean breaker = false;
        Feature feature = new SpecialFeature();
        ReportManager.QUERY_PARAMS = new HashMap();
        Map<String, Object> answerList = new HashMap<String, Object>();
        Object value = "";
        List<ReportParam> repo = (List<ReportParam>) report.getReportParamCollection();
        CollectionSorting.ordenarLista(repo, "paramName");

        for (ReportParam param : repo) {

            listeners.fire("status", "Carregando parâmetros");

            if (answerList.get(param.getParamAnswer()) == null) {
                feature.setBehavior(new AnswerTransform());
                value = JOptionPane.showInputDialog(null, feature.perform(param.getParamAnswer(), param.getParamClazz()).toString(), "Parâmetro", JOptionPane.QUESTION_MESSAGE);
                answerList.put(param.getParamAnswer(), value);
            } else {
                value = answerList.get(param.getParamAnswer());
            }


            if (value == null) {
                breaker = true;

                break;
            }


            if (param.getParamClazz().equalsIgnoreCase(java.util.Date.class.getName())) {
                feature.setBehavior(new IsDB2Driver());
                if ((Boolean) feature.perform(report.getIdD().getDriver())) {
                    feature.setBehavior(new BrazilianToAmericanLocale());
                    value = feature.perform(value.toString());
                }

                ReportManager.QUERY_PARAMS.put(param.getParamName(), value.toString());
            } else if (param.getParamClazz().equalsIgnoreCase(Integer.class.getName())) {
                //Vislumbrando clausula in para tipo inteiro(se valor contiver virgula)
                if (IsNumber.isNumeric(value.toString())) {
                    
                    if(report.getTitle().startsWith("Formação de Saldos")){
                        feature.setBehavior(new DeparaFilialQQToTB());
                        ReportManager.QUERY_PARAMS.put(param.getParamName(), new Integer(feature.perform(value).toString()));
                    }else{
                        ReportManager.QUERY_PARAMS.put(param.getParamName(), new Integer(value.toString()));
                    }
                    
                } else {
                    
                    if(report.getTitle().startsWith("Formação de Saldos")){
                        feature.setBehavior(new DeparaFilialQQToTB());
                        ReportManager.QUERY_PARAMS.put(param.getParamName(), feature.perform(value));
                    }else{
                        ReportManager.QUERY_PARAMS.put(param.getParamName(), value.toString());
                    }
                    
                    
                }
            } else if (param.getParamClazz().equalsIgnoreCase(BigDecimal.class.getName())) {
                ReportManager.QUERY_PARAMS.put(param.getParamName(), new BigDecimal(value.toString()));
            } else {                
                ReportManager.QUERY_PARAMS.put(param.getParamName(), value.toString());
            }

        }

        listeners.fire("status", "Exportando relatório... acompanhe o progresso no barra ao lado");

        ReportManager repMan = new ReportManager(report);
        ReportManager.TARGET_FILE_NAME = "relatorio.xls";


        //////////Caminho onde salvar///////////////////////////////////
        StringBuilder filePath = new StringBuilder();
        if (OS_NAME.startsWith(WIN_ID)) {
            filePath.append("c:");
        } else {
            filePath.append(System.getProperty("user.home"));
        }
        filePath.append(System.getProperty("file.separator"));
        filePath.append("relatorios");
        filePath.append(System.getProperty("file.separator"));
        /////////////////////////////////////////////////////////////////

        ReportManager.TARGET_FILE_PATH = filePath.toString();

        if (!breaker) {
            try {
                if (new XlsExporter(listeners).export(repMan)) {
                    showBrowseOption(filePath.toString());

                } else {
                    showNoResults();
                    listeners.fire("status", "Nenhum resultado encontrado...");
                }
            } catch (Exception ex) {
                listeners.fire("status", "Erro: Não foi possível gerar relatório!");
                Exceptions.printStackTrace(ex);
            }
        } else {
            listeners.fire("status", "Exportação do relatório foi cancelada!");
        }
        return breaker;
    }

    private void showNoResults() {
        JOptionPane.showMessageDialog(null, "Não existem registros para o relatório", "Exportação", JOptionPane.INFORMATION_MESSAGE);
    }
    private static final String OS_NAME = System.getProperty("os.name");
    private static final String WIN_ID = "Windows";
    private static final String LINUX_ID = "Linux";

    private void showBrowseOption(String arquivo) {
        System.out.println("File path -> " + arquivo);

        String WIN_ID = "Windows";
        String LINUX_ID = "Linux";
        String diretorio = arquivo.substring(0, arquivo.lastIndexOf(System.getProperty("file.separator")));

        //Mostra Dialog de opções.
        Object[] options = {"Sim", "Não"};
        int option = JOptionPane.showOptionDialog(null, "Deseja abrir pasta onde o relatório foi gerado ?", "Abrir local", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[0]); //selecionado
        if (option == 0) {
            Object obj = null;
            try {
                if (System.getProperty("os.name").startsWith(WIN_ID)) {
                    String command = "explorer.exe \"" + diretorio + "\" ";
                    obj = Runtime.getRuntime().exec(command);
                } else if (System.getProperty("os.name").startsWith(LINUX_ID)) {
                    obj = Runtime.getRuntime().exec("nautilus " + diretorio);
                }
            } catch (IOException ex) {
                if (obj == null) {
                    try {
                        obj = Runtime.getRuntime().exec("konqueror " + diretorio);
                    } catch (IOException ex2) {
                    }
                }
            }

            if (obj == null) {
                JOptionPane.showMessageDialog(null, "Não foi possível abrir o diretório, o faça manualmente!", "Explorador de Arquivos não Encontrado", JOptionPane.WARNING_MESSAGE);
            }
        }
    }
}
